/**
 * 1.当我们大谈基于信道通信时，应该指的是应用级别。如果是操作系统，应该还是会有多种措施的，否则rust的源头在哪里来着。
 * 2.rust共享内存，主要借助于Arc指针实现。所谓Arc，是Atomically Reference Counted的缩写，即原子引用计数。 它和Rc的主要
 *   区别在于，Arc允许多线程同时访问，而Rc不允许。
 *   Arc的clone方法主要作用是增加引用计数，而不是复制数据，确保多个所有者可以安全共享同一数据
 * 3.此外还需要借助于Mutex（mutual exclusion 互相排斥之意），即互斥锁，来保证同一时刻只有一个线程可以访问共享资源。
 * 4.Mutex的主要方法有lock(),lock用于获取锁，如果成功返回一个MutexGuard智能指针。获取锁的时候，会阻塞线程
 * 5.MutexGuard智能指针实现了Deref和Drop，因此可以被当作原始数据的引用,同时Drop确保了当MutexGuard离开作用域时，锁会被释放。
 * 6.Mutex 是一个类似RefCell的智能指针,都提供了内部可变性
 * 7.Mutex<T> 也有造成 死锁（deadlock）的风险：当某个操作需要锁住两个资源，而两个线程分别持有两个资源的其中一个锁时，它们会永远相互等待
 * 8.对于简单的数值运算，标准库中 std::sync::atomic 模块 提供了比 Mutex<T> 更简单的类型。针对基本类型，这些类型提供了安全、并发、原子的操作
 *   例如 AtomicI32 
 *   
 * 
 */
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];
    for _ in 0..10 {
        let c = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = c.lock().unwrap();
            *num += 1;
            println!("线程{:?}正在执行,得到{}", thread::current().id(),*num);
        });
        handles.push(handle);
    }
    for handle in handles {
        handle.join().unwrap();
    }
    println!("Result: {}", *counter.lock().unwrap());
}